package logManage

import (
	"errors"
	"github.com/gin-gonic/gin"
	"main/src/apps"
	"main/src/utils"
	"time"
)

type CreateLogDto struct {
	Referrer  string `json:"referrer"`   // 请求来源
	IP        string `json:"ip"`         // 请求 IP 地址
	UserAgent string `json:"user_agent"` // 用户浏览器和操作系统信息
	URL       string `json:"url"`        // 域名 URL
}

type LogInfoResponseDto struct {
	Id        int       `json:"id"`
	Referrer  string    `json:"referrer"`   // 请求来源
	IP        string    `json:"ip"`         // 请求 IP 地址
	UserAgent string    `json:"user_agent"` // 用户浏览器和操作系统信息
	URL       string    `json:"url"`        // 域名 URL
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

func (dto *LogInfoResponseDto) format(log Log) {
	dto.Id = log.Id
	dto.Referrer = log.Referrer
	dto.IP = log.IP
	dto.URL = log.URL
	dto.UserAgent = log.UserAgent
	dto.UpdatedAt = log.UpdatedAt
	dto.CreatedAt = log.CreatedAt
}

func (dto *CreateLogDto) Create(c *gin.Context) (res LogInfoResponseDto, err error) {
	model := &Log{
		Referrer:  dto.Referrer,
		IP:        dto.IP,
		UserAgent: dto.UserAgent,
		URL:       dto.URL,
	}
	result := apps.DB.Create(model)
	err = result.Error
	if err != nil {
		utils.Response(
			c,
			"插入失败err: "+err.Error(),
			utils.Status.Error,
			nil,
		)
	} else {
		res.format(*model)
	}
	return res, err
}

type GetLogDto struct {
	utils.GetDataLimitDto
	IP string `json:"ip"` // 域名名称
}

func (dto *GetLogDto) Get(c *gin.Context) (responseDto utils.GetDataLimitResponseDto, err error) {
	dto.Init()

	if dto.PageNum < 0 {
		utils.Response(c, "page_num < 0", utils.Status.Error, nil)
		return responseDto, errors.New("page < 0")
	}
	var models []Log
	var contents []*LogInfoResponseDto
	var count int64
	if dto.IP == "" {
		apps.DB.Limit(dto.PageSize).Offset((dto.PageNum - 1) * dto.PageSize).Preload("Links").Find(&models).Limit(-1).Offset(-1).Count(&count)
	} else {
		apps.DB.Where("ip like '%" + dto.IP + "%' ").Limit(dto.PageSize).Offset((dto.PageNum - 1) * dto.PageSize).Preload("Links").Find(&models).Limit(-1).Offset(-1).Count(&count)
	}
	for i := range models {
		temp := &LogInfoResponseDto{}
		temp.format(models[i])
		contents = append(contents, temp)
	}
	responseDto.Init(dto.GetDataLimitDto, count, contents)
	return responseDto, err
}

type UpdateLogDto struct {
	Id        int    `json:"id" binding:"required"`
	URL       string `json:"url"`        // 域名 URL
	Referrer  string `json:"referrer"`   // 请求来源
	IP        string `json:"ip"`         // 请求 IP 地址
	UserAgent string `json:"user_agent"` // 用户浏览器和操作系统信息
}

func (dto *UpdateLogDto) UpdateContent(c *gin.Context) (ctn *Log, err error) {
	content := &Log{Id: dto.Id}
	result := apps.DB.Where(content).Find(&content)
	if result.Error == nil && len(content.URL) > 0 {
		if dto.URL != "" {
			content.URL = dto.URL
		}
		if dto.Referrer != "" {
			content.Referrer = dto.Referrer
		}
		if dto.IP != "" {
			content.IP = dto.IP
		}
		if dto.UserAgent != "" {
			content.UserAgent = dto.UserAgent
		}
		result = apps.DB.Save(&content)
		err = result.Error
	}
	if err == nil && result.RowsAffected == 0 {
		err = errors.New("该数据以删除，或没有该ID")
	}
	if err != nil {
		utils.Response(
			c,
			"更新失败err: "+err.Error(),
			utils.Status.Error,
			nil,
		)
	}
	return content, err
}

type DeleteLogDto struct {
	Id int `json:"id" binding:"required"`
}

func (dto *DeleteLogDto) DeleteLog(c *gin.Context) (err error) {
	result := apps.DB.Delete(&Log{Id: dto.Id})
	err = result.Error
	if err != nil {
		utils.Response(
			c,
			"删除失败err: "+err.Error(),
			utils.Status.Error,
			nil,
		)
	}
	return err
}
